//多态：父类型的引用指向了子类型的对象，不同类型的对象针对想同的方法产生了不同的行为
(() => {
    class Animal {
        name:string
        constructor(name:string){
            this.name = name
        }
        //实例方法
        run(distance:number = 0){
            console.log(`跑了${distance}米这么远的距离`,this.name)
        }
    }

    class Dog extends Animal {
        constructor(name:string){
            //调用父类的构造函数，实现子类中属性的初始化操作
            super(name)
        }
        //实例方法，重写父类中的实例方法
        run(distance:number = 5){
            console.log(`跑了${distance}米这么远的距离`,this.name)
        }

    }

    class Pig extends Animal {
        constructor(name:string){
            //调用父类的构造函数，实现子类中属性的初始化操作
            super(name)
        }
        //实例方法，重写父类中的实例方法
        run(distance:number = 10){
            console.log(`跑了${distance}米这么远的距离`,this.name)
        }
    }

    //实例化对象
    const ani:Animal = new Animal('动物')
    ani.run()
    
    const dog:Dog = new Dog('大黄')
    dog.run()

    const pig:Pig = new Pig('八戒')
    pig.run()

    console.log("-------------------------")
    //父类和子类的关系：父类类型创建子类
    const dog1:Animal = new Dog('小黄')
    dog1.run()

    const pig1:Animal = new Pig('小猪')
    pig1.run()

    console.log("-------------------------")
    //该函数需要的参数类型是Animal
    function shoeRun(ani:Animal){
        ani.run()
    }

    shoeRun(dog1)
    shoeRun(pig1)
})()